package servlet.ogrenci;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.RequestDispatcher;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import siniflar.OdevNot;
import siniflar.OdevOgrenci;
import siniflar.Ogrenci;
import vt.Veritabani;

public class OdevGonder extends HttpServlet {

    private static final String GECICI_YOL = "ogrenci/gecici";
    private File geciciDizin;
    private static final String HEDEF_YOL = "ogrenci/dosyalar/odev";
    private File hedefDizin;
    private String hedefYol;

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        String geciciYol = getServletContext().getRealPath(GECICI_YOL);
        geciciDizin = new File(geciciYol);
        if (!geciciDizin.isDirectory()) {
            throw new ServletException(GECICI_YOL + " dizin sorunu");
        }

        hedefYol = getServletContext().getRealPath(HEDEF_YOL);
        hedefDizin = new File(hedefYol);
        if (!hedefDizin.isDirectory()) {
            throw new ServletException(HEDEF_YOL + " dizin sorunu");
        }
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");

        OdevOgrenci odev = new OdevOgrenci();

        HttpSession oturum = request.getSession();
        Ogrenci gonderen = (Ogrenci) oturum.getAttribute("ogrenci");
        int odevid = (Integer) oturum.getAttribute("odevno");
        Veritabani vt = new Veritabani();
        boolean yazmaHakki = false;

        DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
        fileItemFactory.setSizeThreshold(1 * 1024 * 1024); //1 MB
        fileItemFactory.setRepository(geciciDizin);

        ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
        try {
            List items = uploadHandler.parseRequest(request);
            Iterator itr = items.iterator();
            while (itr.hasNext()) {
                FileItem item = (FileItem) itr.next();

                if (item.isFormField()) {
                    if (item.getFieldName().equals("odevBaslikTxt")) {
                        odev.setBaslik(item.getString().trim());
                    } else if (item.getFieldName().equals("odevAciklamaTxt")) {
                        odev.setAciklama(item.getString().trim());
                    }
                } else {
                    if (item.getName() == null || item.getName().trim().equals("")) {
                        yazmaHakki = false;
                    } else {
                        yazmaHakki = true;
                        odev.setDosyaYolu("dosyalar/odev/" + item.getName());
                        File file = new File(hedefDizin, item.getName());
                        item.write(file);
                    }
                }

            }
        } catch (FileUploadException ex) {
            log("Error encountered while parsing the request", ex);
        } catch (Exception ex) {
            log("Error encountered while uploading file", ex);
        }

        if (!formKontrol(odev.getBaslik(), odev.getAciklama())
                || !(formNullKontrol(odev.getBaslik(), odev.getAciklama()))) {
            oturum.setAttribute("odevDurum", "Girişleri boş bırakmayınız.");
            response.sendRedirect("OdevAyrinti?odevno=" + odevid);
            return;
        }

        // dosya yüklenmedi. O zaman veritabanına yazma işlemi yapılmaz
        if (!yazmaHakki) {
            oturum.setAttribute("odevDurum", "Dosya yüklenmelidir.");
            response.sendRedirect("OdevAyrinti?odevno=" + odevid);
            return;
        } else {
            odev.setGonderen(gonderen);

            odev.setOdev(vt.odevVer(odevid));
            vt.ogrenciOdevGonder(odev);
            
            oturum.setAttribute("odevSayisi", vt.ogrenciYanitlanmayanOdevSayisiVer(gonderen));
            oturum.setAttribute("odevDurum", "Ödeviniz başarıyla gönderildi.");
            response.sendRedirect("OdevAyrinti?odevno=" + odevid);
            return;
        }

    }

    /**
     * Get metodu bu servlet için kullanılmaz. Çünkü dosya gönderimi POST
     * isteğiyle gerçekleşmeli ve bu sadece doPost ile yapılır. Get ile bir
     * istek gelirse bu reddedilir.
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.sendRedirect("Odevler");
        return;
    }

    public void yonlendir(HttpServletRequest request, HttpServletResponse response, String adres)
            throws ServletException, IOException {
        RequestDispatcher dispatcher = request.getRequestDispatcher(adres);
        dispatcher.forward(request, response);
    }

    // herhangi biri boşsa yanlış döner. Sıkıntı yoksa true
    private boolean formKontrol(String baslik, String aciklama) {
        return !(baslik.equals("") || aciklama.equals(""));
    }

    private boolean formNullKontrol(String baslik, String aciklama) {
        return !(baslik == null || aciklama == null);
    }
}